import { post, get } from '@/request/index'

// 预约查询参数接口
export interface AppointmentQueryParams {
  id?: string | null
  staffId: string
  patientId?: string | null
  patientName?: string | null
  typeId: number
  slotNo?: number | null
  bookedAt: string // 就诊时间，格式：YYYY-MM-DD HH:mm:ss
  period: '上午' | '下午' // 就诊时段
  status?: number | null // 1表示已预约，2表示已取消
  pageNum: number // 页码，从1开始
  pageSize: number // 每页大小
}

// 预约信息接口
export interface AppointmentInfo {
  id: string
  patientId: string
  patientName: string
  period: '上午' | '下午'
  slotNo: number
  status: number // 1表示已预约，2表示已取消
  bookedAt: string // ISO格式时间字符串
  cancelReason?: string | null
}

// 分页响应接口
export interface PageableResponse {
  pageNumber: number
  pageSize: number
}

// API响应接口
export interface AppointmentResponse {
  code: number
  msg: string
  data: {
    content: AppointmentInfo[]
    pageable: PageableResponse
    totalElements: number  // 添加总记录数字段
    totalPages: number     // 总页数
    size: number          // 每页大小
    number: number        // 当前页码
  }
}

/**
 * 获取患者预约列表
 * @param params 查询参数
 * @returns 预约列表响应
 */
export const getPatientAppointments = (params: AppointmentQueryParams) => {
  return post<{
    content: AppointmentInfo[]
    pageable: PageableResponse
    totalElements: number  // 添加总记录数
    totalPages: number     // 总页数
    size: number          // 每页大小
    number: number        // 当前页码
  }>('/appointment/getPatientApp', params)
}

/**
 * 将UTC时间转换为中国时间
 * @param utcTime UTC时间字符串
 * @returns 中国时间字符串
 */
export const convertToChineseTime = (utcTime: string): string => {
  const parts = new Intl.DateTimeFormat('zh-CN', {
    timeZone: 'Asia/Shanghai',
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: false
  }).formatToParts(new Date(utcTime))
  const get = (t: string) => parts.find(p => p.type === t)?.value ?? ''
  return `${get('year')}-${get('month')}-${get('day')} ${get('hour')}:${get('minute')}:${get('second')}`
}

/**
 * 格式化预约状态
 * @param status 状态码
 * @returns 状态文本
 */
export const formatAppointmentStatus = (status: number): string => {
  switch (status) {
    case 1:
      return '已预约'
    case 2:
      return '已取消'
    default:
      return '未知状态'
  }
}

/**
 * 格式化预约时间为API需要的格式
 * @param date 日期
 * @param period 时段
 * @returns 格式化的时间字符串
 */
export const formatBookedAt = (date: string, period: '上午' | '下午'): string => {
  const baseTime = '00:00:00'
  console.log(baseTime)
  return `${date} ${baseTime}`
}

// 医生坐诊信息接口
export interface DoctorClinicInfo {
  id: string
  period: '上午' | '下午'
}

// 获取医生坐诊信息响应接口
export interface DoctorClinicResponse {
  code: number
  msg: string
  data: DoctorClinicInfo[]
}

/**
 * 获取当天医生坐诊信息
 * @param staffId 医生员工ID
 * @returns 医生坐诊信息
 */
export const getCurrentClinicStaff = (staffId: string) => {
  return get<DoctorClinicInfo[]>('/appointment/getCurrentClicStaff', { params: { staffId } })
}

// 叫号队列项接口
export interface QueueItem {
  id: string // 预约id
  clnicId: string
  slotNo: number
}

// 叫号队列响应接口
export interface QueueResponse {
  code: number
  msg: string
  data: QueueItem[]
}

/**
 * 获取叫号队列
 * @param staffId 医生员工ID
 * @param clinicId 坐诊ID
 * @returns 叫号队列数据
 */
export const getQueue = (staffId: string, clnicId: string) => {
  return get<QueueItem[]>('/appointment/getQueue', { params: { staffId, clnicId } })
}

/**
 * 叫号
 * @param id 预约ID
 * @returns 叫号结果
 */
export const callSlot = (id: string) => {
  return get<{ code: number; msg: string }>('/appointment/callSlot', { params: { id } })
}

// 更新预约状态请求参数接口
export interface UpdateAppointmentStatusRequest {
  id: string // 预约单号id
  staffId: number
  clnicId: string
  slotNo: number
}

// 更新预约状态响应接口
export interface UpdateAppointmentStatusResponse {
  code: number
  msg: string
}

/**
 * 更新患者预约状态
 * @param params 更新参数
 * @returns 更新结果
 */
export const updatePatientAppStatus = (params: UpdateAppointmentStatusRequest) => {
  return post<UpdateAppointmentStatusResponse>('/appointment/updatePatientAppStatus', params)
}